from Sodev.asignacionContinua import AsignacionContinua
from Sodev.Block import Block

class CompactacionParaAbajo:
    def __init__(self):
        self.memoria = None
        
    def getInstrs(self):
        ret = []
        for i in range(self.memoria.getMemoriaFisica().getSize()+1):
            if(self.memoria.memoriaFisica.read(i) != None):
                ret.append(self.memoria.getMemoriaFisica().read(i))
                
        return ret
    
    def getBlockesUsados(self):
        blockesUsados = []
        for b in self.memoria.usedBlocks:
            blockesUsados.append(b)
        return blockesUsados
        
    
    def compactarBloques(self):
        blockesUsados = self.getBlockesUsados()
        self.memoria.usedBlocks = []
        #esto es el tamanio de la memoria pero desde aca no se peude llamr :<
        index = 9 - len(self.getInstrs())+1
        for b in blockesUsados:
            tamanioBloque =(b.getEndPos() - b.getInitPos())
            endP =index + tamanioBloque
            b.setInitPos(index)
            b.setEndPos(endP)
            index = index + tamanioBloque + 1
            self.memoria.usedBlocks.append(b)
        self.memoria.freeBlocks = []
        blockF=Block()
        blockF.setInitPos(0)
        #blockF.setEndPos(self.memoria.getMemoriaFisica().getSize())
        #ESTO ES UN PARCHE EL DE ARRIBA NO SE PORQUE NO ANDA 
        blockF.setEndPos(9 - len(self.getInstrs()))
        self.memoria.freeBlocks.append(blockF)
            
    #despues pasalo a tu spanglishh
    def compactar(self):
        instrucciones = self.getInstrs()
        self.memoria.getMemoriaFisica().reset()
        #tamanio de memoria no esto
        index = 9 - (len(instrucciones))+1
        for i in range(len(instrucciones)):
            self.memoria.getMemoriaFisica().write(index,instrucciones[i])
            index = index + 1
        self.compactarBloques()